package com.woniuxy.aspectj;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

//基于AspectJ的xml模式切面：只需要通知即可,切面类中的方法，就是通知！
public class MyAspectJ {
    //前置通知
    //JoinPoint对象封装了SpringAop中切面方法的信息,在切面方法中添加JoinPoint参数,就可以获取到封装了该方法信息的JoinPoint对象
    public void myBefore(JoinPoint joinPoint) {
        //在需要对一个service方法添加事务时，加上这个注解，如果发生unchecked exception例除数为0，就会发生rollback
        //在具体的类（或类的方法）上使用 @Transactional 注解，而不要使用在类所要实现的任何接口上
        System.out.println("前置通知：模拟判断是否有@Transcational注解");
        System.out.println("目标类：" + joinPoint.getTarget().getClass().getName());
        System.out.println(",被织入的增强目标的方法是：" + joinPoint.getSignature().getName());
    }
    //后置通知
    public void myAfterReturning(JoinPoint joinPoint) {
        System.out.println("后置通知：模拟事务的提交");
        //确定在哪个方法？？？？后执行
        System.out.println("目标类：" + joinPoint.getTarget().getClass().getName());
        System.out.println(",被织入的增强目标的方法是：" + joinPoint.getSignature().getName());
    }
    //环绕通知：不推荐使用，功能强大
    public Object myAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("环绕开始：执行目标方法之前……");
        //Object procceed = proceedingJoinPoint.proceed();
        Object []args = proceedingJoinPoint.getArgs();
        args[0]=0;
        args[1]=0;
        //proceed放行
        List proceed=(List)proceedingJoinPoint.proceed(args);
        proceed=new ArrayList<>();
        Map<Object,Object>objectObjectMap=new HashMap<>();
        objectObjectMap.put("a","你中病毒了");
        objectObjectMap.put("b","请支付比特币0.09个");
        proceed.add(objectObjectMap);
        System.out.println("环绕结束：执行目标方法之后……");
        return proceed;
    }



    //异常通知
    public void myAfterThrowing(JoinPoint joinPoint,Throwable e){
        System.out.println("异常通知");
        System.out.println("报错信息"+e.getMessage());
    }
    //最终通知
    public  void myAfter(){
        System.out.println("最终通知：模拟方法结束后释放资源，关闭SqlSession");
    }


}
